home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 52 / Amiga Format AFCD52 (Issue 136, May 2000).iso / -serious- / programming / basic / mildred / lha / minimildredsourceasc.lha / MiniMildred.ascii
Text File  |  1999-02-23  |  48KB  |  1,981 lines

  1. .MiniMildred ; Mistress of chunky magic - Chunky-to-planar subsystem
  2.  
  3. ;************************************************
  4. ;
  5. ;$VER:MiniMildred V1.19 (21/10/1998)-(23/02/1998)
  6. ;
  7. ;Copyright (c) 1998, Paul West.
  8. ;
  9. ;************************************************
  10.  
  11. ;History
  12. ;v1.1  - First public release of full Mildred library
  13. ;v1.11 - Fixed bug in MUseShapeBank and altered ShapesTotal size to word as it was incorrectly a longword
  14. ;      - Fixed bug in the errorchecking of Mc2pCPUmode that was checking d3 instead of d0
  15. ;v1.12 - Fixed bug in MUnQueue that would only do two lines of code if wrapping was active, but should have been done always
  16. ;v1.13 - MBoxF, MBoxFShape, MBoxFStencil and MBoxFCookie added
  17. ;      - MBox, MBoxShape, MBoxStencil and MBoxCookie added
  18. ;v1.14 - MPlanar16ToBitmap, MPlanar16ToShape added
  19. ;v1.15 - Planar-to-chunky converter optimised further using addx and reverse bitplane order, twice as fast as roxr.b #n,dn
  20. ;      - MGenericPtr added
  21. ;      - A shape's handle is unconditionally added to Xpos,Ypos in MBlit,MBlock,MQBlit,MQBlock,MSBlit,MSBlock,MQSBlit,MQSBlock
  22. ;v1.16 - Fixed small bug in !PerformPoint macro, d6.l should have been d6.w.
  23. ;      - Fixed small but ineffective bug in MPlotCookie, d6.l should have been d6.w
  24. ;v1.17 - Added MCludgeCookie and MCludgeStencil, also needed to add two macros
  25. ;      - Fixed bug in macro used by MCludgeCookie and MCludgeStencil, as it was not setting `SHere' to 0 to indicate cludge.
  26. ;v1.18 - Added MUnQueueRange for unqueuing a range of items without flushing the queue
  27. ;      - Taken out all non-c2p routines to produce mini version of library for use as c2p system only
  28. ;v1.19 - Bugfixed Mc2pWindow to store window number at start to avoid being trashed by cache flush
  29.  
  30. #MiniMildredLibNum=16
  31.  
  32. #PlaneSize=16 ; Dummy c2p SMC value
  33. #LVOCacheClearU=-$27C
  34. #LVOAvailMem=-$D8
  35. #BlitzAllocmem=$c002
  36. #BlitzFreemem=$c003
  37. #ClearPublicMem=1|65536
  38.  
  39. #c2pWindowStructSize=4 ; LSL for 16 bytes
  40.  
  41. !libheader {#MiniMildredLibNum,Init,0,Finish,RunErrors}
  42.  
  43. ;Definitions
  44.  
  45. !astatement
  46. !args      {#byte}
  47. !libs
  48. !subs      {_Mc2pRowLacing,0,0}
  49. !name      {"MMc2pRowLacing","State.b ; Toggle row-lacing in c2p On/Off. NonZero=On"}
  50.  
  51. !astatement
  52. !args      {#byte}
  53. !libs
  54. !subs      {_Mc2pColumnLacing,0,0}
  55. !name      {"MMc2pColumnLacing","State.b ; Toggle column-lacing in c2p On/Off"}
  56.  
  57. !astatement
  58. !args
  59. !libs
  60. !subs      {_Mc2pRowLaceToggle,0,0}
  61. !name      {"MMc2pRowToggle"," ; Toggle c2p row lacing between Even/Odd rows"}
  62.  
  63. !astatement
  64. !args
  65. !libs
  66. !subs      {_Mc2pColumnLaceToggle,0,0}
  67. !name      {"MMc2pColumnToggle"," ; Toggle c2p column lacing between Even/Odd columns"}
  68.  
  69. !astatement
  70. !args
  71. !libs
  72. !subs      {_Mc2pLaceToggleSingle,0,0}
  73. !name      {"MMc2pToggleSingle"," ; Toggle c2p lacing for single-buffered display"}
  74.  
  75. !astatement
  76. !args      {#byte}
  77. !libs
  78. !subs      {_Mc2pLaceToggleDouble,_Mc2pLaceToggleDoubleCheck,0}
  79. !name      {"MMc2pToggleDouble","Buf.b ; 0 or 1. Toggle c2p lacing for double-buffered display"}
  80.  
  81. !astatement
  82. !args      {#byte}
  83. !libs
  84. !subs      {_Mc2pLaceToggleTriple,_Mc2pLaceToggleTripleCheck,0}
  85. !name      {"MMc2pToggleTriple","Buf.b ; 0, 1 or 2. Toggle c2p lacing for triple-buffered display"}
  86.  
  87. !astatement
  88. !args      {#byte,#byte}
  89. !libs
  90. !subs      {_Mc2pLaceToggle,_Mc2pLaceToggleCheck,0}
  91. !name      {"MMc2pToggle","Buffers.b,Buf.b ; 1, 2 or 3, and 0, 1 or 2. Toggle c2p lacing."}
  92.  
  93. !astatement
  94. !args      {#byte}
  95. !libs
  96. !subs      {_M040c2pUsage,0,0}
  97. !name      {"MM040c2pUsage","Status.b ; On/Off - Availability of 040 c2p. Overrides Mc2pCPUmode"}
  98.  
  99. !astatement
  100. !args      {#byte}
  101. !libs
  102. !subs      {_Mc2pCPUmode,_Mc2pCPUmodeCheck,0}
  103. !name      {"MMc2pCPUmode","CPU.b ; Set cpu c2p uses. Use Blitz's `Processor'. <4=030-, 4=040+"}
  104.  
  105. !astatement
  106. !args      {#word,#word,#word}
  107. !libs
  108. !subs      {_Mc2pWindowBriefShort,_Mc2pWindowBriefShortCheck,0}
  109. !args      {#word,#word,#word,#byte}
  110. !libs
  111. !subs      {_Mc2pWindowBrief,_Mc2pWindowBriefCheck,0}
  112. !args      {#word,#word,#word,#word,#word,#word}
  113. !libs
  114. !subs      {_Mc2pWindowShort,_Mc2pWindowShortCheck,0}
  115. !args      {#word,#word,#word,#word,#byte,#word,#word}
  116. !libs
  117. !subs      {_Mc2pWindow,_Mc2pWindowCheck,0}
  118. !name      {"MMc2pWindow","c2pWindow#.w,OpWidth.w,OpHeight.w[,SourceBWidth.w[,Processor.b],PlanarWidth.w,PlanarHeight.w]"}
  119.  
  120. !afunction {#word}
  121. !args      {#word}
  122. !libs
  123. !subs      {_Mc2pWindowWidth,_Mc2pWindowWidthCheck,0}
  124. !name      {"MMc2pWindowWidth","(c2pWindowNumber.w) ; Returns width of c2pWindow"}
  125.  
  126. !afunction {#word}
  127. !args      {#word}
  128. !libs
  129. !subs      {_Mc2pWindowHeight,_Mc2pWindowHeightCheck,0}
  130. !name      {"MMc2pWindowHeight","(c2pWindowNumber.w) ; Returns height of c2pWindow"}
  131.  
  132. !astatement
  133. !args      {#word,#word}
  134. !libs
  135. !subs      {_Mc2pWindowNewHeight,_Mc2pWindowNewHeightCheck,0}
  136. !name      {"MMc2pWindowNewHeight","c2pWindow#.w,NewHeight.w ; Change height of already defined c2p object"}
  137.  
  138. !astatement
  139. !args      {#word,#long,#long}
  140. !libs
  141. !subs      {_Mc2p,_Mc2pCheck,0}
  142. !name      {"MMc2p","c2pWindow#.w,Chunky.l,Planar.l ; Convert chunky to planar (Use Mc2pWindow first)"}
  143.  
  144. !acommand  {#long}
  145. !args      {#word}
  146. !libs
  147. !subs      {_MReservec2pWindows,_MReservec2pWindowsCheck,0}
  148. !name      {"MMReservec2pWindows","[(]NumberOfWindows.w[)] ; Reserve structure-memory for c2pWindows"}
  149.  
  150. !astatement
  151. !args      {#word,#word}
  152. !libs
  153. !subs      {_MFreec2pWindowsRange,_MFreec2pWindowsRangeCheck,0}
  154. !args
  155. !libs
  156. !subs      {_MFreec2pWindows,_MFreec2pWindowsCheck,0}
  157. !name      {"MMFreec2pWindows","[Firstc2pWindow.w,Lastc2pWindow.w] ; Free/delete all/range of c2pwindows"}
  158.  
  159. !astatement
  160. !args      {#word}
  161. !libs
  162. !subs      {_MFreec2pWindow,_MFreec2pWindowCheck,0}
  163. !name      {"MMFreec2pWindow"," Free/delete a pre-existing c2pWindow"}
  164.  
  165. !afunction {#long}
  166. !args      {#word}
  167. !libs
  168. !subs      {_MAddrc2pWindow,_MAddrc2pWindowCheck,0}
  169. !name      {"MMAddrc2pWindow","(c2pWindowNumer.w} ; Returns address of c2pWindow structure"}
  170.  
  171. !astatement
  172. !args      {#word}
  173. !libs
  174. !subs      {_MUsec2pWindowsShortest,_MUsec2pWindowsShortestCheck,0}
  175. !args      {#word,#word}
  176. !libs
  177. !subs      {_MUsec2pWindowsShort,_MUsec2pWindowsShortCheck,0}
  178. !args      {#word,#word,#word}
  179. !libs
  180. !subs      {_MUsec2pWindows,_MUsec2pWindowsCheck,0}
  181. !name      {"MMUsec2pWindows","Mainc2pWindowNum.w[,Secondc2pWindowNum.w[,Thirdc2pWindowNum.w]] ; Current to use"}
  182.  
  183. !astatement
  184. !args      {#word}
  185. !libs
  186. !subs      {_MUsec2pWindow,_MUsec2pWindowCheck,0}
  187. !name      {"MMUsec2pWindow","c2pWindowNumber.w ; Current to use"}
  188.  
  189. !afunction {#word}
  190. !args
  191. !libs
  192. !subs      {_MUsedc2pWindow,_MUsedc2pWindowCheck,0}
  193. !name      {"MMUsedc2pWindow"," ; Returns currently used c2pWindow"}
  194.  
  195. !astatement
  196. !args      {#byte}
  197. !libs
  198. !subs      {_MAutoUsec2pWindows,0,0}
  199. !name      {"MMAutoUsec2pWindows","True/False ; Automatically `use' new c2pWindows. <>0=True"}
  200.  
  201. !astatement
  202. !args      {#word,#word}
  203. !libs
  204. !subs      {_MCopyc2pWindowStruct,_MCopyc2pWindowStructCheck,0}
  205. !name      {"MMCopyc2pWindow","Sourcec2pWindow.w,Destc2pWindow.w ; Copy definition-data only"}
  206.  
  207. !afunction {#long}
  208. !args      {#word,#word,#long,#word}
  209. !libs
  210. !subs      {_MGenericPtr,_MGenericPtrCheck,0}
  211. !name      {"MMGenericPtr","Xpos.w,Ypos.w,BaseAddress.l,RowWidth.w ; Calculate and return address based on inputs"}
  212.  
  213. Init
  214. !nullsub{Initialise,0,0}
  215. Finish
  216. !nullsub{FinishUp,0,0}
  217. !libfin
  218.  
  219. ;**-Macros-***************************************************************************
  220. .Macros
  221.  
  222. Macro CheckAvailMem
  223. ;Having set up parameters ready to Allocmem, check it's available
  224. ;Returns success in d2
  225. ;`1=Label counter
  226. ;d0=Amount required
  227.   MOVEM.l d0/d1/a6,-(a7) ; Store
  228.   MOVE.l  $4,a6        ; Execbase
  229.   AND.l   #$FFFEFFFF,d1 ; Memtype without `clear'
  230.   JSR     LVOAvailMem(a6)
  231.   MOVE.l  d0,d2
  232.   MOVEM.l (a7)+,d0/d1/a6 ; Restore
  233.   CMP.l   d0,d2
  234.   BLT     CheckAvMFailed`1
  235.   MOVEM.l d0/d1/a6,-(a7) ; Store
  236.   MOVE.l  $4,a6
  237.   AND.l   #$FFFEFFFF,d1 ; Memtype without `clear'
  238.   OR.l    #$20000,d1 ; Largest
  239.   JSR     LVOAvailMem(a6)
  240.   MOVE.l  d0,d2
  241.   MOVEM.l (a7)+,d0/d1/a6 ; Restore
  242.   CMP.l   d0,d2
  243.   BLT     CheckAvMFailed`1
  244.   MOVEQ.l #1,d2 ; Success
  245.   BRA     CheckAvMSkip`1
  246. CheckAvMFailed`1
  247.   MOVEQ.l #0,d2 ; Error
  248. CheckAvMSkip`1
  249. End Macro
  250.  
  251. Macro Getc2pWindowObjectPtr
  252. ;Get address of c2pWindow structure of specified c2pWindow
  253. ;d0=c2pWindow number
  254. ;Returns address in a0
  255.   AND.l   #$FFFF,d0 ; Only words are valid
  256.   LSL.l   #c2pWindowStructSize,d0
  257.   MOVE.l  c2pWindowsMem,a0
  258.   ADD.l   d0,a0
  259.   LSR.l   #c2pWindowStructSize,d0 ; keep d0 intact
  260. End Macro ; Return with a0=structure address
  261.  
  262. Macro RoundUpWidth
  263. ;Used when creating new resource to ensure width is multiple of 4 (round up)
  264. ;Trashes d7
  265. ;`1=Lable counter
  266. ;d1=Width.w
  267.   MOVE.w  d1,d7 ; Temp
  268.   AND.b   #$FC,d1 ; Round down width to nearest 4
  269.   AND.b   #$03,d7 ; Mask off remainder bits
  270.   BEQ     RoundUWskip`1
  271.   ADDQ.w  #4,d1
  272.   TST.w   d1 ; Has it accidentally become >signed word limit?
  273.   BGT     RoundUWskip`1
  274.   SUBQ.w  #4,d1 ; Can't have it rounded up, crop
  275. RoundUWskip`1
  276. End Macro
  277.  
  278. ;**-Common-Check-Macros-**************************************************************
  279. .CommonCheckMacros
  280.  
  281. Macro CThreec2pWindowChecks
  282. ;Three commonly used checks for c2pWindow commands
  283.   !CCheckc2pWindowsExist
  284.   !CCheckc2pWindowNum
  285.   !CCheckc2pWindowNumExists
  286. End Macro
  287.  
  288. Macro CCheckc2pWindowNum
  289. ;Check that c2pWindow number is in valid range
  290.   TST.w   d0
  291.   BLT     Error0 ; Too small
  292.   CMP.w   c2pWindowsTotal,d0
  293.   BGE     Error0 ; Too large
  294. End Macro
  295.  
  296. Macro CCheckc2pWindowsExist
  297. ;Check that memory has been allocated for c2pWindow objects
  298.   TST.l   c2pWindowsMem ; Exist?
  299.   BEQ     Error16 ; No, error
  300. End Macro
  301.  
  302. Macro CCheckc2pWindowNumExists
  303. ;Check that a given c2pWindow object exists
  304.   !Getc2pWindowObjectPtr ; Base into a0
  305.   TST.l   c2p0_Pixels-c2pWindows(a0) ; Test Pixels and RowsStore
  306.   BEQ     Error17 ; Doesn't exist
  307. End Macro
  308.  
  309. Macro CCheckWordParam
  310. ;Check that d0 word parameter is valid (not negative)
  311.   TST.w   d0
  312.   BLT     Error18
  313. End Macro
  314.  
  315. Macro CCheckWordParam2
  316. ;Check that d0 word parameter is valid (not negative, and also greater than 0)
  317.   TST.w   d0
  318.   BLE     Error25
  319. End Macro
  320.  
  321. ;**-Routines-*************************************************************************
  322.  
  323. .Initialise
  324.   MOVE.b  #0,c2pLace
  325.   MOVE.b  #0,c2pLaceFrame
  326.   MOVE.b  #0,c2pColumns
  327.   MOVE.b  #0,c2pColumnsFrame
  328.   MOVE.b  #1,c2p040useable
  329.   MOVE.b  #1,c2pCPUmode
  330.   MOVE.l  #0,c2pWindowsMem
  331.   MOVE.b  #-1,Autoc2pWindowsUse
  332.   RTS
  333.  
  334. ;*************************************************************************************
  335.  
  336. .FinishUp
  337.   RTS
  338.  
  339. ;*************************************************************************************
  340.  
  341. ._Mc2pRowLacing
  342. ;Switch c2p row lacing on or off (nonzero=on)
  343.   TST.b   d0
  344.   BEQ     c2piskip
  345.   MOVE.b #1,c2pLace
  346.   BRA   c2piskip2
  347. c2piskip
  348.   MOVE.b #0,c2pLace
  349. c2piskip2
  350.   MOVE.b  #0,c2pLaceFrame
  351.   RTS
  352.  
  353. ;*************************************************************************************
  354.  
  355. ._Mc2pColumnLacing
  356. ;Switch c2p column lacing on or off
  357.   TST.b   d0
  358.   BEQ     c2pcskip
  359.   MOVE.b  #1,c2pColumns
  360.   MOVEQ.l #4*8,d7 ;-)                         SELF MODIFYING CODE ;-)
  361.   MOVE.l  d7,c2pSMCL001-4 ; Modify a0
  362.   MOVE.l  d7,c2pSMCL002-4
  363.   MOVE.l  d7,c2pSMCL007-4
  364.   MOVE.l  d7,c2pSMCL008-4
  365.   MOVE.l  d7,c2pSMCL011-4
  366.   MOVE.l  d7,c2pSMCL012-4
  367.   MOVEQ.l #4,d7
  368.   MOVE.l  d7,c2pSMCL003-4 ; Modify a1/a2
  369.   MOVE.l  d7,c2pSMCL004-4
  370.   MOVE.l  d7,c2pSMCL005-4
  371.   MOVE.l  d7,c2pSMCL006-4
  372.   MOVE.l  d7,c2pSMCL009-4
  373.   MOVE.l  d7,c2pSMCL010-4
  374.   MOVE.l  d7,c2pSMCL013-4
  375.   MOVE.l  d7,c2pSMCL014-4
  376.   BRA   c2pcskip2
  377. c2pcskip
  378.   MOVE.b  #0,c2pColumns
  379.   MOVEQ.l #0,d7 ;-)                           SELF MODIFYING CODE ;-)
  380.   MOVE.l  d7,c2pSMCL001-4 ; Modify a0/a1/a2
  381.   MOVE.l  d7,c2pSMCL002-4
  382.   MOVE.l  d7,c2pSMCL003-4
  383.   MOVE.l  d7,c2pSMCL004-4
  384.   MOVE.l  d7,c2pSMCL005-4
  385.   MOVE.l  d7,c2pSMCL006-4
  386.   MOVE.l  d7,c2pSMCL007-4
  387.   MOVE.l  d7,c2pSMCL008-4
  388.   MOVE.l  d7,c2pSMCL009-4
  389.   MOVE.l  d7,c2pSMCL010-4
  390.   MOVE.l  d7,c2pSMCL011-4
  391.   MOVE.l  d7,c2pSMCL012-4
  392.   MOVE.l  d7,c2pSMCL013-4
  393.   MOVE.l  d7,c2pSMCL014-4
  394. c2pcskip2
  395.   MOVE.b  #0,c2pColumnsFrame
  396. ;Flush the cache!
  397.   MOVEM.l  a3-a6,-(a7) ; Just in case
  398.   MOVE.l  $4,a6
  399.   JSR     LVOCacheClearU(a6)
  400.   MOVEM.l (a7)+,a3-a6 ; Restore
  401.   RTS
  402.  
  403. ;*************************************************************************************
  404. ._Mc2pRowToggle
  405. _Mc2pRowLaceToggle
  406. ;Set c2p interlacing even/odd frame
  407.   MOVEQ.l #1,d0
  408.   SUB.b   c2pLaceFrame,d0
  409.   MOVE.b  d0,c2pLaceFrame
  410.   RTS
  411.  
  412. ;*************************************************************************************
  413. ._Mc2pColumnToggle
  414. _Mc2pColumnLaceToggle
  415. ;Set c2p column lacing even/odd frame
  416.   MOVEQ.l #1,d0
  417.   SUB.b   c2pColumnsFrame,d0
  418.   MOVE.b  d0,c2pColumnsFrame
  419.   RTS
  420.  
  421. ;*************************************************************************************
  422. ._Mc2pToggleSingle
  423. _Mc2pLaceToggleSingle
  424.   MOVEQ.l #1,d0 ; Single buffered
  425.   BRA     _Mc2pLaceToggle
  426. ._Mc2pToggleDouble
  427. _Mc2pLaceToggleDouble
  428.   MOVE.l  d0,d1
  429.   MOVEQ.l #2,d0 ; Double buffered
  430.   BRA     _Mc2pLaceToggle
  431. ._Mc2ToggleTriple
  432. _Mc2pLaceToggleTriple
  433.   MOVE.l  d0,d1
  434.   MOVEQ.l #3,d0 ; Triple buffered
  435. ._Mc2pToggle
  436. _Mc2pLaceToggle
  437. ;Handle c2p lacing for single, double, and triple buffered displays
  438.   SUBQ.l  #1,d0 ; Buffers-1
  439.   BEQ     c2pLaceSingle ; Single buffered
  440.   TST.b   d1 ; Buf=0?
  441.   BNE     c2pBufNot0
  442. c2pLaceSingle
  443.   TST.b   c2pLace ; Row lacing?
  444.   BEQ     c2pLaceNotRow ; No, skip
  445.   BSR     _Mc2pRowLaceToggle
  446.   TST.b   c2pLaceFrame
  447.   BEQ     c2pLaceDone
  448.   TST.b   c2pColumns ; Row lacing and column lacing?
  449.   BEQ     c2pLaceNotColumn ; No, skip
  450.   BSR     _Mc2pColumnLaceToggle
  451. c2pLaceNotColumn
  452.   RTS     ; Done
  453. c2pLaceNotRow
  454.   TST.b   c2pColumns ; Column lacing only?
  455.   BEQ     c2pLaceNotColumn2 ; No, skip
  456.   BSR     _Mc2pColumnLaceToggle
  457. c2pLaceNotColumn2
  458.   RTS
  459. c2pBufNot0
  460. c2pLaceDone
  461.   RTS
  462.  
  463. ;*************************************************************************************
  464.  
  465. ._M040c2pUsage
  466. ;Switch 040+ chunky to planar routines on or off. NonZero=On
  467. ;Note they won't be used anyway if there is no 040+ available
  468.   MOVE.b  d0,c2p040useable ; Store status
  469.   RTS
  470.  
  471. ;*************************************************************************************
  472.  
  473. ._Mc2pCPUmode
  474. ;Set the cpu that the c2p is going to use, as there are 030- and 040+ routines
  475. ;Note that this setting is overridden by M040c2p's setting
  476.   CMP.b   #4,d0 ; Check for 040
  477.   BNE     c2pCPUmode030
  478.   MOVE.b  #1,c2pCPUmode
  479.   RTS
  480. c2pCPUmode030
  481.   MOVE.b  #0,c2pCPUmode
  482.   RTS
  483.  
  484. ;*************************************************************************************
  485.  
  486. _Mc2pWindowBriefShort
  487.   MOVE.l  d1,d3
  488.   MOVE.l  d1,d5
  489.   MOVE.l  d2,d6
  490.   MOVE.b  c2pCPUmode,d4
  491.   LSL.b   #2,d4 ; Reverse engineeer cpu number
  492.   BRA     _Mc2pWindow
  493. _Mc2pWindowBrief
  494.   MOVE.l  d3,d4
  495.   MOVE.l  d1,d3
  496.   MOVE.l  d1,d5
  497.   MOVE.l  d2,d6
  498.   BRA     _Mc2pWindow
  499. _Mc2pWindowShort
  500.   MOVE.l  d5,d6
  501.   MOVE.l  d4,d5
  502.   MOVE.b  c2pCPUmode,d4
  503.   LSL.b   #2,d4 ; Reverse engineer cpu number
  504. ._Mc2pWindow
  505. ;Initialises chunky-to-planar, also self-modifies code to alter #planesize
  506. ;Note that Planar YOffset has been removed.
  507. ;d0.w=c2pWindow number
  508. ;d1.w=Chunky operation width (window width)
  509. ;d2.w=Chunky operation height (window height)
  510. ;d3.w=Source width (length of a line in the whole chunky buffer, not a window)
  511. ;d4.b=Processor (blitz instruction, will be 0/1/2/3/4)
  512. ;d5.w=Planar width (full width of bitmap)
  513. ;d6.w=Planar height (full height of bitmap)
  514.   CMP.b   #4,d4 ; 040+?
  515.   BNE     c2pWlowCPU2
  516.   MOVE.b  #1,c2pCPUmode
  517.   BRA     c2pWskip2
  518. c2pWlowCPU2
  519.   MOVE.b  #0,c2pCPUmode
  520. c2pWskip2
  521.   AND.l   #$FFFF,d0
  522.   !Getc2pWindowObjectPtr ; Get base into a0
  523.   AND.l   #$FFFF,d1
  524.   AND.l   #$FFFF,d2
  525.   TST.b   Autoc2pWindowsUse ; Use it?
  526.   BEQ     c2pWDontUse ; No
  527.   MOVE.w  d0,Currentc2pWindow1 ; Yes, store c2pWindow number in current
  528. c2pWDontUse
  529.   AND.l   #$FFFF,d3
  530.   AND.l   #$FFFF,d5
  531.   AND.l   #$FFFF,d6
  532.   MOVE.b  c2pLace,c2p0Lace-c2pWindows(a0) ; Copy row-lacing status
  533.   MOVE.w  d3,c2p0LaceOffsetA-c2pWindows(a0) ; source byte offset for odd lace frames
  534.   MOVE.l  d5,d7 ;temp
  535.   LSR.l   #3,d7 ;bytes per line planar
  536.   MOVE.w  d7,c2p0LaceOffsetB-c2pWindows(a0) ; destination byte offset for odd lace frames
  537.   MOVE.l  d3,d7 ;temp
  538.   SUB.l   d1,d3
  539.   TST.b   c2pLace ; Check for interlace
  540.   BEQ     c2pNoLace ; No
  541.   ADD.l   d7,d3 ; Yes, skip 1 row in source
  542. c2pNoLace
  543.   MOVE.w  d3,c2p0_Cmod-c2pWindows(a0) ; Source chunky modulo in bytes and pixels (same)
  544.   MOVE.w  d1,c2p0_Pixels-c2pWindows(a0) ; Pixels per row chunky
  545.   TST.b   c2pLace ; Check for interlace
  546.   BEQ     c2pNoLace2 ; No
  547.   LSR.l   #1,d2 ; lines/2 ; Yes, skip every other row in number of lines
  548. c2pNoLace2
  549.   SUBQ.l  #1,d2 ; loopcounter
  550.   MOVE.w  d2,c2p0_RowsStore-c2pWindows(a0) ; Chunky rows (loopcounter)
  551.   MOVE.l  d5,d7 ; store
  552.   SUB.l   d1,d5
  553.   TST.b   c2pLace ; Check for interlace
  554.   BEQ     c2pNoLace3 ; No
  555.   ADD.l   d7,d5 ; skip 1 line ; Yes, skip 1 row in dest
  556. c2pNoLace3
  557.   LSR.l   #3,d5
  558.   MOVE.w  d5,c2p0_Pmod-c2pWindows(a0) ; Horizontal Planar modulo in bytes
  559.   ;SMC, #PlaneSize
  560.   MULU    d6,d7
  561.   LSR.l   #3,d7 ; PlaneSize
  562.   MOVE.l  d7,c2pSMC001-4 ;-)                    SELF MODIFYING CODE! ;-)
  563.   MOVE.l  d7,c2pSMC011-4
  564.   MOVE.l  d7,c2pSMC012-4
  565.   MOVE.l  d7,c2pSMC013-4
  566.   MOVE.l  d7,c2pSMC014-4
  567.   MOVE.l  d7,c2pSMC019-4
  568.   MOVE.l  d7,c2pSMC020-4
  569.   MOVE.l  d7,c2pSMC021-4
  570.   MOVE.l  d7,c2pSMC026-4
  571.   MOVE.l  d7,c2pSMC027-4
  572.   MOVE.l  d7,c2pSMC031-4
  573.   MOVE.l  d7,c2pSMC032-4
  574.   MOVE.l  d7,c2pSMC037-4
  575.   MOVE.l  d7,c2pSMC038-4
  576.   ;SMC, #-PlaneSize
  577.   MOVEQ.l #0,d6
  578.   SUB.l   d7,d6 ; d6=-PlaneSize
  579.   MOVE.l  d6,c2pSMC003-4
  580.   MOVE.l  d6,c2pSMC004-4
  581.   MOVE.l  d6,c2pSMC005-4
  582.   MOVE.l  d6,c2pSMC006-4
  583.   MOVE.l  d6,c2pSMC015-4
  584.   MOVE.l  d6,c2pSMC016-4
  585.   MOVE.l  d6,c2pSMC017-4
  586.   MOVE.l  d6,c2pSMC018-4
  587.   ;SMC, #-PlaneSize-4
  588.   SUBQ.l  #4,d6
  589.   MOVE.l  d6,c2pSMC022-4
  590.   MOVE.l  d6,c2pSMC023-4
  591.   MOVE.l  d6,c2pSMC028-4
  592.   MOVE.l  d6,c2pSMC029-4
  593.   MOVE.l  d6,c2pSMC033-4
  594.   MOVE.l  d6,c2pSMC034-4
  595.   MOVE.l  d6,c2pSMC039-4
  596.   MOVE.l  d6,c2pSMC040-4
  597.   ;SMC, #PlaneSize*2
  598.   ADD.l   d7,d7
  599.   MOVE.l  d7,c2pSMC007-4
  600.   MOVE.l  d7,c2pSMC008-4
  601.   MOVE.l  d7,c2pSMC009-4
  602.   MOVE.l  d7,c2pSMC010-4
  603.   MOVE.l  d7,c2pSMC024-4
  604.   MOVE.l  d7,c2pSMC025-4
  605.   MOVE.l  d7,c2pSMC035-4
  606.   MOVE.l  d7,c2pSMC036-4
  607.   ;SMC, #PlaneSize*4
  608.   ADD.l   d7,d7
  609.   MOVE.l  d7,c2pSMC002-4
  610.   MOVE.l  d7,c2pSMC030-4
  611. ;Flush the cache!
  612.   MOVEM.l  a3-a6,-(a7) ; Just in case
  613.   MOVE.l  $4,a6
  614.   JSR     LVOCacheClearU(a6)
  615.   MOVEM.l (a7)+,a3-a6 ; Restore
  616.   RTS
  617.  
  618. ;*************************************************************************************
  619.  
  620. ._Mc2pWindowWidth
  621. ;Return the width of an existing c2pWindow object
  622.   !Getc2pWindowObjectPtr ; Base in a0
  623.   MOVE.w  c2p0_Pixels-c2pWindows(a0),d0
  624.   RTS
  625.  
  626. ;*************************************************************************************
  627.  
  628. ._Mc2pWindowHeight
  629. ;Return the height of an existing c2pWindow object
  630.   !Getc2pWindowObjectPtr ; Base in a0
  631.   MOVE.w  c2p0_RowsStore-c2pWindows(a0),d0
  632.   RTS
  633.  
  634. ;*************************************************************************************
  635.  
  636. ._Mc2pWindowNewHeight
  637. ;Having already initialised a c2pWindow object, change its height
  638.   MOVE.l  c2pWindowsMem,a0 ; Base
  639.   EXT.l   d0
  640.   LSL.l   #4,d0 ; Find offset
  641.   ADD.l   d0,a0 ; Point
  642.   TST.b   c2p0Lace-c2pWindows(a0) ; object has data setup for row lacing?
  643.   BEQ     c2pWindowNewHeightSkip
  644.   LSR.w   #1,d1 ; Proposed height/2
  645. c2pWindowNewHeightSkip
  646.   SUBQ.w  #1,d1 ; Loopcounter
  647.   MOVE.w  d1,c2p0_RowsStore-c2pWindows(a0) ; Store new row counter
  648.   RTS
  649.  
  650. ;*************************************************************************************
  651.  
  652. ._Mc2p
  653. ;AGA ChunkyToPlanar conversion.
  654. ;Different routines for 000-030 and 040-060.
  655.  
  656.   ;Handle c2pWindows
  657.   !Getc2pWindowObjectPtr ; Base into a0
  658.   MOVE.l  a0,a2
  659.   MOVE.w  c2p0_Pixels-c2pWindows(a2),c2p_Pixels
  660.   MOVE.w  c2p0_RowsStore-c2pWindows(a2),c2p_RowsStore
  661.   MOVE.w  c2p0_Pmod-c2pWindows(a2),c2p_Pmod
  662.   MOVE.w  c2p0_Cmod-c2pWindows(a2),c2p_Cmod
  663.  
  664.   MOVE.l  d1,a0 ; Chunky
  665.   MOVE.l  d2,a1 ; Planar
  666.  
  667.   ;Handle row lacing
  668.   TST.b   c2pLace ; Row Interlacing?
  669.   BEQ     c2pLaceSkip ; No
  670.   TST.b   c2pLaceFrame ; Odd interlace row?
  671.   BEQ     c2pLaceSkip
  672.   ADD.w   c2p0LaceOffsetA-c2pWindows(a2),a0 ; Skip 1 chunky row
  673.   ADD.w   c2p0LaceOffsetB-c2pWindows(a2),a1 ; Skip 1 planar row
  674. c2pLaceSkip
  675.  
  676.   ;Handle column lacing
  677.   TST.b   c2pColumns ; Columns?
  678.   BEQ     c2pColumnsSkip ; No
  679.   TST.b   c2pColumnsFrame ; Odd column number?
  680.   BEQ     c2pColumnsSkip
  681.   ADD.w   #32,a0 ; Skip 1 chunky column (32 pixels)
  682.   ADD.w   #4,a1  ; Skip 1 planar column (32 pixels)
  683. c2pColumnsSkip
  684.  
  685.   MOVE.w  c2p_RowsStore,c2p_Rows ; Also halfway through c2p030
  686.  
  687.   MOVEM.l a3-a6,-(a7)
  688.  
  689.   TST.b   c2pCPUmode ; 030 routine?
  690.   BEQ     c2p030
  691.   TST.b   c2p040useable ; Allowed to use 040 routine?
  692.   BEQ     c2p030
  693.  
  694. ;Routine for 68040 and 68060.
  695. ;Used to be c2p040only.
  696. c2p040
  697.  
  698.   MOVE.w  c2p_Pixels,a3
  699.   ADD.l   a0,a3
  700.  
  701.   ADD.l   #PlaneSize,a1
  702. c2pSMC001
  703.   MOVE.l  a1,a2
  704.   ADD.l   #PlaneSize*4,a2
  705. c2pSMC002
  706.  
  707. c2p040loop
  708.   MOVE.l  (a0)+,d0
  709.   MOVE.l  (a0)+,d1
  710.   MOVE.l  (a0)+,d2
  711.   MOVE.l  (a0)+,d3
  712.   MOVE.l  (a0)+,d4
  713.   MOVE.l  (a0)+,d5
  714.  
  715.   MOVE.l  d4,d7     ; Swap 16x4, part 1
  716.   MOVE.w  d0,d4
  717.   SWAP    d4
  718.   MOVE.w  d4,d0
  719.   MOVE.w  d7,d4
  720.   MOVE.l  d5,d7
  721.   MOVE.w  d1,d5
  722.   SWAP    d5
  723.   MOVE.w  d5,d1
  724.   MOVE.w  d7,d5
  725.  
  726.   MOVE.l  d4,d7     ; Swap 2x4, part 1
  727.   LSR.l   #2,d7
  728.   EOR.l   d0,d7
  729.   AND.l   #$33333333,d7
  730.   EOR.l   d7,d0
  731.   LSL.l   #2,d7
  732.   EOR.l   d7,d4
  733.   MOVE.l  d5,d7
  734.   LSR.l   #2,d7
  735.   EOR.l   d1,d7
  736.   AND.l   #$33333333,d7
  737.   EOR.l   d7,d1
  738.   LSL.l   #2,d7
  739.   EOR.l   d7,d5
  740.  
  741.   MOVE.l  (a0)+,a5
  742.   MOVE.l  (a0)+,a6
  743.  
  744.   EXG     d4,a5
  745.   EXG     d5,a6
  746.  
  747.   MOVE.l  d4,d7     ; Swap 16x4, part 2
  748.   MOVE.w  d2,d4
  749.   SWAP    d4
  750.   MOVE.w  d4,d2
  751.   MOVE.w  d7,d4
  752.   MOVE.l  d5,d7
  753.   MOVE.w  d3,d5
  754.   SWAP    d5
  755.   MOVE.w  d5,d3
  756.   MOVE.w  d7,d5
  757.  
  758. ADD.l #0,a0 ; #4*8 Custom verticle interlacing
  759. c2pSMCL001
  760.  
  761.   MOVE.l  d4,d7     ; Swap 2x4, part 2
  762.   LSR.l   #2,d7
  763.   EOR.l   d2,d7
  764.   AND.l   #$33333333,d7
  765.   EOR.l   d7,d2
  766.   LSL.l   #2,d7
  767.   EOR.l   d7,d4
  768.   MOVE.l  d5,d7
  769.   LSR.l   #2,d7
  770.   EOR.l   d3,d7
  771.   AND.l   #$33333333,d7
  772.   EOR.l   d7,d3
  773.   LSL.l   #2,d7
  774.   EOR.l   d7,d5
  775.  
  776.   MOVE.l  d1,d7     ; Swap 4x1
  777.   LSR.l   #4,d7
  778.   EOR.l   d0,d7
  779.   AND.l   #$0f0f0f0f,d7
  780.   EOR.l   d7,d0
  781.   LSL.l   #4,d7
  782.   EOR.l   d7,d1
  783.   MOVE.l  d3,d7
  784.   LSR.l   #4,d7
  785.   EOR.l   d2,d7
  786.   AND.l   #$0f0f0f0f,d7
  787.   EOR.l   d7,d2
  788.   LSL.l   #4,d7
  789.   EOR.l   d7,d3
  790.  
  791.   BRA c2pStart040a
  792. c2pX040a
  793.   MOVE.l  (a0)+,d0
  794.   MOVE.l  (a0)+,d1
  795.   MOVE.l  (a0)+,d2
  796. ADD.l #-PlaneSize,a1
  797. c2pSMC003
  798.   MOVE.l  (a0)+,d3
  799.   MOVE.l  (a0)+,d4
  800.   MOVE.l  (a0)+,d5
  801.  
  802. ;  MOVE.l  a6,-PlaneSize(a1)
  803. MOVE.l a6,(a1)
  804.  
  805.   MOVE.l  d4,d7     ; Swap 16x4, part 1
  806.   MOVE.w  d0,d4
  807.   SWAP    d4
  808.   MOVE.w  d4,d0
  809.   MOVE.w  d7,d4
  810.   MOVE.l  d5,d7
  811.   MOVE.w  d1,d5
  812.   SWAP    d5
  813.   MOVE.w  d5,d1
  814.   MOVE.w  d7,d5
  815. SUB.l #-PlaneSize,a1
  816. c2pSMC004
  817.  
  818.   MOVE.l  d4,d7     ; Swap 2x4, part 1
  819.   LSR.l   #2,d7
  820.   EOR.l   d0,d7
  821.   AND.l   #$33333333,d7
  822.   EOR.l   d7,d0
  823.   LSL.l   #2,d7
  824.   EOR.l   d7,d4
  825.   MOVE.l  d5,d7
  826.   LSR.l   #2,d7
  827.   EOR.l   d1,d7
  828.   AND.l   #$33333333,d7
  829.   EOR.l   d7,d1
  830.   LSL.l   #2,d7
  831.   EOR.l   d7,d5
  832.  
  833. ADD.l #-PlaneSize,a2
  834. c2pSMC005
  835.  
  836.   MOVE.l  (a0)+,d7
  837.   MOVE.l  (a0)+,a6
  838.  
  839. ;  MOVE.l  a5,-PlaneSize(a2)
  840. MOVE.l a5,(a2)
  841.  
  842.   MOVE.l  d7,a5
  843.   EXG     d4,a5
  844.   EXG     d5,a6
  845.  
  846. SUB.l #-PlaneSize,a2
  847. c2pSMC006
  848.  
  849. ADD.l #0,a0 ; #4*8Custom verticle interlacing
  850. c2pSMCL002
  851.  
  852.   MOVE.l  d4,d7     ; Swap 16x4, part 2
  853.   MOVE.w  d2,d4
  854.   SWAP    d4
  855.   MOVE.w  d4,d2
  856.   MOVE.w  d7,d4
  857.   MOVE.l  d5,d7
  858.   MOVE.w  d3,d5
  859.   SWAP    d5
  860.   MOVE.w  d5,d3
  861.   MOVE.w  d7,d5
  862.  
  863.   MOVE.l  d4,d7     ; Swap 2x4, part 2
  864.   MOVE.l  d6,(a2)+
  865.  
  866.   LSR.l   #2,d7
  867.   EOR.l   d2,d7
  868.   AND.l   #$33333333,d7
  869.   EOR.l   d7,d2
  870.   LSL.l   #2,d7
  871.   EOR.l   d7,d4
  872.   MOVE.l  d5,d7
  873.   LSR.l   #2,d7
  874.   EOR.l   d3,d7
  875.   AND.l   #$33333333,d7
  876.   EOR.l   d7,d3
  877.   LSL.l   #2,d7
  878.   EOR.l   d7,d5
  879.  
  880. ADD.l #0,a2 ; #4 Custom verticle interlacing
  881. c2pSMCL003
  882.  
  883.   MOVE.l  d1,d7     ; Swap 4x1
  884.   LSR.l   #4,d7
  885.   EOR.l   d0,d7
  886.   MOVE.l  a4,(a1)+
  887.  
  888.   AND.l   #$0f0f0f0f,d7
  889.   EOR.l   d7,d0
  890.   LSL.l   #4,d7
  891.   EOR.l   d7,d1
  892.   MOVE.l  d3,d7
  893.   LSR.l   #4,d7
  894.   EOR.l   d2,d7
  895.   AND.l   #$0f0f0f0f,d7
  896.   EOR.l   d7,d2
  897.   LSL.l   #4,d7
  898.   EOR.l   d7,d3
  899.  
  900. ADD.l #0,a1 ; #4 Custom verticle interlacing
  901. c2pSMCL004
  902.  
  903. c2pStart040a
  904.  
  905. ADD.l #PlaneSize*2,a2
  906. c2pSMC007
  907.  
  908.   MOVE.l  d2,d7     ; Swap 8x2, part 1
  909.   LSR.l   #8,d7
  910.   EOR.l   d0,d7
  911.   AND.l   #$00ff00ff,d7
  912.   EOR.l   d7,d0
  913.   LSL.l   #8,d7
  914.   EOR.l   d7,d2
  915.   MOVE.l  d2,d7
  916.   LSR.l   #1,d7     ; Swap 1x2, part 1
  917.   EOR.l   d0,d7
  918.   AND.l   #$55555555,d7
  919.   EOR.l   d7,d0
  920. ;  MOVE.l  d0,PlaneSize*2(a2)
  921. MOVE.l d0,(a2)
  922.   ADD.l   d7,d7
  923.   EOR.l   d7,d2
  924.   MOVE.l  d3,d7     ; Swap 8x2, part 2
  925.   LSR.l   #8,d7
  926.   EOR.l   d1,d7
  927.   AND.l   #$00ff00ff,d7
  928.   EOR.l   d7,d1
  929.   LSL.l   #8,d7
  930.   EOR.l   d7,d3
  931. SUB.l #PlaneSize*2,a2
  932. c2pSMC008
  933.   MOVE.l  d3,d7
  934.   LSR.l   #1,d7     ; Swap 1x2, part 2
  935.   EOR.l   d1,d7
  936. ADD.l #PlaneSize*2,a1
  937. c2pSMC009
  938.   AND.l   #$55555555,d7
  939.   EOR.l   d7,d1
  940. ;  MOVE.l  d1,PlaneSize*2(a1)
  941. MOVE.l d1,(a1)
  942.   ADD.l   d7,d7
  943.   EOR.l   d7,d3
  944.  
  945.   MOVE.l  d5,d7
  946.   LSR.l   #4,d7
  947.   EOR.l   d4,d7
  948.   AND.l   #$0f0f0f0f,d7
  949.   EOR.l   d7,d4
  950.   LSL.l   #4,d7
  951.   EOR.l   d7,d5
  952.  
  953. SUB.l #PlaneSize*2,a1
  954. c2pSMC010
  955.  
  956.   EXG     d4,a5
  957.   EXG     d5,a6
  958.  
  959. ADD.l #PlaneSize,a2
  960. c2pSMC011
  961.  
  962.   MOVE.l  d5,d7
  963.   LSR.l   #4,d7
  964.   EOR.l   d4,d7
  965.   AND.l   #$0f0f0f0f,d7
  966.   EOR.l   d7,d4
  967.   LSL.l   #4,d7
  968.   EOR.l   d7,d5
  969.  
  970.   MOVE.l  a5,d0
  971.   MOVE.l  a6,d1
  972. ;  MOVE.l  d2,PlaneSize(a2)
  973. MOVE.l d2,(a2)
  974.  
  975.   MOVE.l  d0,d7     ; Swap 8x2, part 3
  976.   LSR.l   #8,d7
  977.   EOR.l   d4,d7
  978.   AND.l   #$00ff00ff,d7
  979.   EOR.l   d7,d4
  980.   LSL.l   #8,d7
  981.   EOR.l   d7,d0
  982. SUB.l #PlaneSize,a2
  983. c2pSMC012
  984.   MOVE.l  d0,d7
  985.   LSR.l   #1,d7     ; Swap 1x2, part 3
  986.   EOR.l   d4,d7
  987.   AND.l   #$55555555,d7
  988.   EOR.l   d7,d4
  989.   ADD.l   d7,d7
  990. ADD.l #PlaneSize,a1
  991. c2pSMC013
  992.   EOR.l   d7,d0
  993.   MOVE.l  d1,d7     ; Swap 8x2, part 4
  994.   LSR.l   #8,d7
  995. ;  MOVE.l  d3,PlaneSize(a1)
  996. MOVE.l d3,(a1)
  997.   EOR.l   d5,d7
  998.   AND.l   #$00ff00ff,d7
  999.   EOR.l   d7,d5
  1000.   LSL.l   #8,d7
  1001.   EOR.l   d7,d1
  1002.   MOVE.l  d1,d7
  1003.   LSR.l   #1,d7     ; Swap 1x2, part 4
  1004.   EOR.l   d5,d7
  1005.   AND.l   #$55555555,d7
  1006.   EOR.l   d7,d5
  1007.   ADD.l   d7,d7
  1008.   EOR.l   d7,d1
  1009.  
  1010. SUB.l #PlaneSize,a1
  1011. c2pSMC014
  1012.  
  1013.   MOVE.l  d0,a5
  1014.   MOVE.l  d1,a6
  1015.  
  1016.   MOVE.l  d4,d6
  1017.   MOVE.l  d5,a4
  1018.  
  1019.   CMP.l   a0,a3
  1020.   BGT     c2pX040a
  1021.  
  1022. ;  MOVE.l  a6,-PlaneSize(a1)
  1023. ADD.l #-PlaneSize,a1
  1024. c2pSMC015
  1025. MOVE.l a6,(a1)
  1026. ;  MOVE.l  a5,-PlaneSize(a2)
  1027. ADD.l #-PlaneSize,a2
  1028. c2pSMC017
  1029. MOVE.l a5,(a2)
  1030. SUB.l #-PlaneSize,a1
  1031. c2pSMC016
  1032.   MOVE.l  a4,(a1)+
  1033. SUB.l #-PlaneSize,a2
  1034. c2pSMC018
  1035.   MOVE.l  d6,(a2)+
  1036.  
  1037. ADD.l #0,a1 ; #4 Custom verticle interlacing
  1038. c2pSMCL005
  1039. ADD.l #0,a2 ; #4 Custom verticle interlacing
  1040. c2pSMCL006
  1041.  
  1042. ;YLoop
  1043.   SUB.w   #1,c2p_Rows
  1044.   BLT     c2p040skip
  1045. c2p040nextrow
  1046.   ADD.w   c2p_Pixels,a3 ; end of next chunky line
  1047.   ADD.w   c2p_Pmod,a1 ; planar dest modulo
  1048.   ADD.w   c2p_Pmod,a2 ; planar dest modulo
  1049.   ADD.w   c2p_Cmod,a0 ; chunky source modulo
  1050.   ADD.w   c2p_Cmod,a3 ; end of next line plus source modulo, because a0 and a3 are compared
  1051.   BRA     c2p040loop
  1052. c2p040skip
  1053.  
  1054.   MOVEM.l (a7)+,a3-a6
  1055.   RTS ; Finish
  1056.  
  1057. ;Routine for 68000, 68010, 68020 and 68030.
  1058. ;Used to be c2p68030only.
  1059. c2p030
  1060.  
  1061.   MOVE.l  #$33333333,d5
  1062.   MOVE.l  #$55555555,d6
  1063.   MOVE.l  #$00ff00ff,a6
  1064.  
  1065.   ADD.l   #PlaneSize,a1
  1066. c2pSMC019
  1067.  
  1068.   MOVE.w  c2p_Pixels,a2
  1069.   ADD.l   a0,a2
  1070.   CMP.l   a0,a2
  1071.   BEQ     c2pNone030a
  1072.  
  1073.   MOVEM.l a0-a1,-(a7)
  1074.  
  1075. c2p030loop
  1076.   MOVE.l  (a0)+,d0
  1077.   MOVE.l  (a0)+,d2
  1078.   MOVE.l  (a0)+,d1
  1079.   MOVE.l  (a0)+,d3
  1080.  
  1081.   MOVE.l  #$0f0f0f0f,d4   ; Merge 4x1, part 1
  1082.   AND.l   d4,d0
  1083.   AND.l   d4,d2
  1084.   LSL.l   #4,d0
  1085.   OR.l    d2,d0
  1086.  
  1087.   AND.l   d4,d1
  1088.   AND.l   d4,d3
  1089.   LSL.l   #4,d1
  1090.   OR.l    d3,d1
  1091.  
  1092.   MOVE.l  d1,a3
  1093.  
  1094.   MOVE.l  (a0)+,d2
  1095.   MOVE.l  (a0)+,d1
  1096.   MOVE.l  (a0)+,d3
  1097.   MOVE.l  (a0)+,d7
  1098.  
  1099.   AND.l   d4,d2     ; Merge 4x1, part 2
  1100.   AND.l   d4,d1
  1101.   LSL.l   #4,d2
  1102.   OR.l    d1,d2
  1103.  
  1104.   AND.l   d4,d3
  1105.   AND.l   d4,d7
  1106.   LSL.l   #4,d3
  1107.   OR.l    d7,d3
  1108.  
  1109.   MOVE.l  a3,d1
  1110.  
  1111. ADD.l #0,a0 ; #4*8 Custom verticle interlacing
  1112. c2pSMCL007
  1113.  
  1114.   MOVE.w  d2,d7     ; Swap 16x2
  1115.   MOVE.w  d0,d2
  1116.   SWAP    d2
  1117.   MOVE.w  d2,d0
  1118.   MOVE.w  d7,d2
  1119.  
  1120.   MOVE.w  d3,d7
  1121.   MOVE.w  d1,d3
  1122.   SWAP    d3
  1123.   MOVE.w  d3,d1
  1124.   MOVE.w  d7,d3
  1125.  
  1126.   BRA     c2pStart030a
  1127. c2pX030a
  1128.  
  1129. ADD.l #PlaneSize,a1
  1130. c2pSMC020
  1131.  
  1132.   MOVE.l  (a0)+,d0
  1133.   MOVE.l  (a0)+,d2
  1134.   MOVE.l  (a0)+,d1
  1135.   MOVE.l  (a0)+,d3
  1136.  
  1137. ;  MOVE.l  d7,PlaneSize(a1)
  1138. MOVE.l d7,(a1)
  1139.  
  1140.   MOVE.l  #$0f0f0f0f,d4   ; Merge 4x1, part 1
  1141.   AND.l   d4,d0
  1142.   AND.l   d4,d2
  1143.   LSL.l   #4,d0
  1144.   OR.l    d2,d0
  1145.  
  1146. SUB.l #PlaneSize,a1
  1147. c2pSMC021
  1148.  
  1149.   AND.l   d4,d1
  1150.   AND.l   d4,d3
  1151.   LSL.l   #4,d1
  1152.   OR.l    d3,d1
  1153.  
  1154.   MOVE.l  d1,a3
  1155.  
  1156.   MOVE.l  (a0)+,d2
  1157.   MOVE.l  (a0)+,d1
  1158.   MOVE.l  (a0)+,d3
  1159.   MOVE.l  (a0)+,d7
  1160.  
  1161.   MOVE.l  a4,(a1)+
  1162.  
  1163.   AND.l   d4,d2     ; Merge 4x1, part 2
  1164.   AND.l   d4,d1
  1165.   LSL.l   #4,d2
  1166.   OR.l    d1,d2
  1167.  
  1168.   AND.l   d4,d3
  1169.   AND.l   d4,d7
  1170.   LSL.l   #4,d3
  1171.   OR.l    d7,d3
  1172.  
  1173.   MOVE.l  a3,d1
  1174.  
  1175. ADD.l #0,a0 ; #4*8 Custom verticle interlacing
  1176. c2pSMCL008
  1177.  
  1178.   MOVE.w  d2,d7     ; Swap 16x2
  1179.   MOVE.w  d0,d2
  1180.   SWAP    d2
  1181.   MOVE.w  d2,d0
  1182.   MOVE.w  d7,d2
  1183.  
  1184. ADD.l #-PlaneSize-4,a1
  1185. c2pSMC022
  1186.  
  1187.   MOVE.w  d3,d7
  1188.   MOVE.w  d1,d3
  1189.   SWAP    d3
  1190.   MOVE.w  d3,d1
  1191.   MOVE.w  d7,d3
  1192.  
  1193. ;  MOVE.l  a5,-PlaneSize-4(a1)
  1194. MOVE.l a5,(a1)
  1195. SUB.l #-PlaneSize-4,a1
  1196. c2pSMC023
  1197.  
  1198. ADD.l #0,a1 ; #4 Custom verticle interlacing
  1199. c2pSMCL009
  1200.  
  1201. c2pStart030a
  1202.   MOVE.l  a6,d4
  1203.  
  1204.   MOVE.l  d2,d7     ; Swap 2x2
  1205.   LSR.l   #2,d7
  1206.   EOR.l   d0,d7
  1207.   AND.l   d5,d7
  1208.   EOR.l   d7,d0
  1209.   LSL.l   #2,d7
  1210.   EOR.l   d7,d2
  1211.  
  1212.   MOVE.l  d3,d7
  1213.   LSR.l   #2,d7
  1214.   EOR.l   d1,d7
  1215.   AND.l   d5,d7
  1216.   EOR.l   d7,d1
  1217.   LSL.l   #2,d7
  1218.   EOR.l   d7,d3
  1219.  
  1220. ADD.l #PlaneSize*2,a1
  1221. c2pSMC024
  1222.  
  1223.   MOVE.l  d1,d7
  1224.   LSR.l   #8,d7
  1225.   EOR.l   d0,d7
  1226.   AND.l   d4,d7
  1227.   EOR.l   d7,d0
  1228.   LSL.l   #8,d7
  1229.   EOR.l   d7,d1
  1230.  
  1231.   MOVE.l  d1,d7
  1232.   LSR.l   #1,d7
  1233.   EOR.l   d0,d7
  1234.   AND.l   d6,d7
  1235.   EOR.l   d7,d0
  1236. ;  MOVE.l  d0,PlaneSize*2(a1)
  1237. MOVE.l d0,(a1)
  1238.   ADD.l   d7,d7
  1239.   EOR.l   d1,d7
  1240.  
  1241.   MOVE.l  d3,d1
  1242.   LSR.l   #8,d1
  1243.   EOR.l   d2,d1
  1244.   AND.l   d4,d1
  1245.   EOR.l   d1,d2
  1246.   LSL.l   #8,d1
  1247.   EOR.l   d1,d3
  1248.  
  1249. SUB.l #PlaneSize*2,a1
  1250. c2pSMC025
  1251.  
  1252.   MOVE.l  d3,d1
  1253.   LSR.l   #1,d1
  1254.   EOR.l   d2,d1
  1255.   AND.l   d6,d1
  1256.   EOR.l   d1,d2
  1257.   ADD.l   d1,d1
  1258.   EOR.l   d1,d3
  1259.  
  1260.   MOVE.l  d2,a4
  1261.   MOVE.l  d3,a5
  1262.  
  1263.   CMPA.l  a0,a2
  1264.   BGT     c2pX030a
  1265.  
  1266. ;  MOVE.l  d7,PlaneSize(a1)
  1267. ADD.l #PlaneSize,a1
  1268. c2pSMC026
  1269. MOVE.l d7,(a1)
  1270. SUB.l #PlaneSize,a1
  1271. c2pSMC027
  1272.   MOVE.l  a4,(a1)+
  1273. ;  MOVE.l  a5,-PlaneSize-4(a1)
  1274. ADD.l #-PlaneSize-4,a1
  1275. c2pSMC028
  1276. MOVE.l a5,(a1)
  1277. SUB.l #-PlaneSize-4,a1
  1278. c2pSMC029
  1279.  
  1280. ADD.l #0,a1 ; #4 Custom verticle interlacing
  1281. c2pSMCL010
  1282.  
  1283. ;YLoop
  1284.   SUB.w   #1,c2p_Rows
  1285.   BLT     c2p030skip
  1286. c2p030nextrow
  1287.   ADD.w   c2p_Pixels,a2 ; End of next chunky line
  1288.   ADD.w   c2p_Pmod,a1 ; Planar dest modulo
  1289.   ADD.w   c2p_Cmod,a0 ; Chunky source modulo
  1290.   ADD.w   c2p_Cmod,a2 ; End of next chunky line + Chunky source modulo
  1291.   BRA     c2p030loop
  1292. c2p030skip
  1293.  
  1294.   MOVEM.l (a7)+,a0-a1
  1295.  
  1296.   MOVE.w  c2p_RowsStore,c2p_Rows ; Has to be reset. Also see start of statement
  1297.   MOVE.w  c2p_Pixels,a2 ; Has to be reset!
  1298.   ADD.l   a0,a2
  1299.  
  1300.   ADD.l   #PlaneSize*4,a1
  1301. c2pSMC030
  1302.  
  1303. c2p030loop2
  1304.   MOVE.l  (a0)+,d0
  1305.   MOVE.l  (a0)+,d2
  1306.   MOVE.l  (a0)+,d1
  1307.   MOVE.l  (a0)+,d3
  1308.  
  1309.   MOVE.l  #$f0f0f0f0,d4   ; Merge 4x1, part 1
  1310.   AND.l   d4,d0
  1311.   AND.l   d4,d2
  1312.   LSR.l   #4,d2
  1313.   OR.l    d2,d0
  1314.  
  1315.   AND.l   d4,d1
  1316.   AND.l   d4,d3
  1317.   LSR.l   #4,d3
  1318.   OR.l    d3,d1
  1319.  
  1320.   MOVE.l  d1,a3
  1321.  
  1322.   MOVE.l  (a0)+,d2
  1323.   MOVE.l  (a0)+,d1
  1324.   MOVE.l  (a0)+,d3
  1325.   MOVE.l  (a0)+,d7
  1326.  
  1327.   AND.l   d4,d2     ; Merge 4x1, part 2
  1328.   AND.l   d4,d1
  1329.   LSR.l   #4,d1
  1330.   OR.l    d1,d2
  1331.  
  1332.   AND.l   d4,d3
  1333.   AND.l   d4,d7
  1334.   LSR.l   #4,d7
  1335.   OR.l    d7,d3
  1336.  
  1337.   MOVE.l  a3,d1
  1338.  
  1339. ADD.l #0,a0 ; #8*4 Custom verticle interlacing
  1340. c2pSMCL011
  1341.  
  1342.   MOVE.w  d2,d7     ; Swap 16x2
  1343.   MOVE.w  d0,d2
  1344.   SWAP    d2
  1345.   MOVE.w  d2,d0
  1346.   MOVE.w  d7,d2
  1347.  
  1348.   MOVE.w  d3,d7
  1349.   MOVE.w  d1,d3
  1350.   SWAP    d3
  1351.   MOVE.w  d3,d1
  1352.   MOVE.w  d7,d3
  1353.  
  1354.   BRA     c2pStart030b
  1355. c2pX030b
  1356.  
  1357. ADD.l #PlaneSize,a1
  1358. c2pSMC031
  1359.  
  1360.   MOVE.l  (a0)+,d0
  1361.   MOVE.l  (a0)+,d2
  1362.   MOVE.l  (a0)+,d1
  1363.   MOVE.l  (a0)+,d3
  1364.  
  1365. ;  MOVE.l  d7,PlaneSize(a1)
  1366. MOVE.l d7,(a1)
  1367.  
  1368.   MOVE.l  #$f0f0f0f0,d4   ; Merge 4x1, part 1
  1369.   AND.l   d4,d0
  1370.   AND.l   d4,d2
  1371.   LSR.l   #4,d2
  1372.   OR.l    d2,d0
  1373.  
  1374. SUB.l #PlaneSize,a1
  1375. c2pSMC032
  1376.  
  1377.   AND.l   d4,d1
  1378.   AND.l   d4,d3
  1379.   LSR.l   #4,d3
  1380.   OR.l    d3,d1
  1381.  
  1382.   MOVE.l  d1,a3
  1383.  
  1384.   MOVE.l  (a0)+,d2
  1385.   MOVE.l  (a0)+,d1
  1386.   MOVE.l  (a0)+,d3
  1387.   MOVE.l  (a0)+,d7
  1388.  
  1389.   MOVE.l  a4,(a1)+
  1390.  
  1391.   AND.l   d4,d2     ; Merge 4x1, part 2
  1392.   AND.l   d4,d1
  1393.   LSR.l   #4,d1
  1394.   OR.l    d1,d2
  1395.  
  1396.   AND.l   d4,d3
  1397.   AND.l   d4,d7
  1398.   LSR.l   #4,d7
  1399.   OR.l    d7,d3
  1400.  
  1401.   MOVE.l  a3,d1
  1402.  
  1403. ADD.l #0,a0 ; #8*4 Custom verticle interlacing
  1404. c2pSMCL012
  1405.  
  1406.   MOVE.w  d2,d7     ; Swap 16x2
  1407.   MOVE.w  d0,d2
  1408.   SWAP    d2
  1409.   MOVE.w  d2,d0
  1410.   MOVE.w  d7,d2
  1411.  
  1412. ADD.l #-PlaneSize-4,a1
  1413. c2pSMC033
  1414.  
  1415.   MOVE.w  d3,d7
  1416.   MOVE.w  d1,d3
  1417.   SWAP    d3
  1418.   MOVE.w  d3,d1
  1419.   MOVE.w  d7,d3
  1420.  
  1421. ;  MOVE.l  a5,-PlaneSize-4(a1)
  1422. MOVE.l a5,(a1)
  1423. SUB.l #-PlaneSize-4,a1
  1424. c2pSMC034
  1425.  
  1426. ADD.l #0,a1 ; #4 Custom verticle interlacing
  1427. c2pSMCL013
  1428.  
  1429. c2pStart030b
  1430.   MOVE.l  a6,d4
  1431.  
  1432.   MOVE.l  d2,d7     ; Swap 2x2
  1433.   LSR.l   #2,d7
  1434.   EOR.l   d0,d7
  1435.   AND.l   d5,d7
  1436.   EOR.l   d7,d0
  1437.   LSL.l   #2,d7
  1438.   EOR.l   d7,d2
  1439.  
  1440.   MOVE.l  d3,d7
  1441.   LSR.l   #2,d7
  1442.   EOR.l   d1,d7
  1443.   AND.l   d5,d7
  1444.   EOR.l   d7,d1
  1445.   LSL.l   #2,d7
  1446.   EOR.l   d7,d3
  1447.  
  1448. ADD.l #PlaneSize*2,a1
  1449. c2pSMC035
  1450.  
  1451.   MOVE.l  d1,d7
  1452.   LSR.l   #8,d7
  1453.   EOR.l   d0,d7
  1454.   AND.l   d4,d7
  1455.   EOR.l   d7,d0
  1456.   LSL.l   #8,d7
  1457.   EOR.l   d7,d1
  1458.  
  1459.   MOVE.l  d1,d7
  1460.   LSR.l   #1,d7
  1461.   EOR.l   d0,d7
  1462.   AND.l   d6,d7
  1463.   EOR.l   d7,d0
  1464. ;  MOVE.l  d0,PlaneSize*2(a1)
  1465. MOVE.l d0,(a1)
  1466.   ADD.l   d7,d7
  1467.   EOR.l   d1,d7
  1468.  
  1469.   MOVE.l  d3,d1
  1470.   LSR.l   #8,d1
  1471.   EOR.l   d2,d1
  1472.   AND.l   d4,d1
  1473.   EOR.l   d1,d2
  1474.   LSL.l   #8,d1
  1475.   EOR.l   d1,d3
  1476.  
  1477. SUB.l #PlaneSize*2,a1
  1478. c2pSMC036
  1479.  
  1480.   MOVE.l  d3,d1
  1481.   LSR.l   #1,d1
  1482.   EOR.l   d2,d1
  1483.   AND.l   d6,d1
  1484.   EOR.l   d1,d2
  1485.   ADD.l   d1,d1
  1486.   EOR.l   d1,d3
  1487.  
  1488.   MOVE.l  d2,a4
  1489.   MOVE.l  d3,a5
  1490.  
  1491.   CMPA.l  a0,a2
  1492.   BGT     c2pX030b
  1493.  
  1494. ;  MOVE.l  d7,PlaneSize(a1)
  1495. ADD.l #PlaneSize,a1
  1496. c2pSMC037
  1497. MOVE.l d7,(a1)
  1498. SUB.l #PlaneSize,a1
  1499. c2pSMC038
  1500.   MOVE.l  a4,(a1)+
  1501. ;  MOVE.l  a5,-PlaneSize-4(a1)
  1502. ADD.l #-PlaneSize-4,a1
  1503. c2pSMC039
  1504. MOVE.l a5,(a1)
  1505. SUB.l #-PlaneSize-4,a1
  1506. c2pSMC040
  1507.  
  1508. ADD.l #0,a1 ; #4 Custom verticle interlacing
  1509. c2pSMCL014
  1510.  
  1511. ;YLoop
  1512.   SUB.w   #1,c2p_Rows
  1513.   BLT     c2p030skip2
  1514. c2p030nextrow2
  1515.   ADD.w   c2p_Pixels,a2 ; End of next chunky line
  1516.   ADD.w   c2p_Pmod,a1 ; Planar dest modulo
  1517.   ADD.w   c2p_Cmod,a0 ; Chunky source modulo
  1518.   ADD.w   c2p_Cmod,a2 ; End of next chunky line + Chunky source modulo
  1519.   BRA     c2p030loop2
  1520. c2p030skip2
  1521.  
  1522. c2pNone030a
  1523.   MOVEM.l (a7)+,a3-a6
  1524.   RTS ; Finish
  1525.  
  1526. ;*************************************************************************************
  1527.  
  1528. ._MReservec2pWindows
  1529. ;Reserve memory for c2pWindow structures
  1530.   MOVE.l  d0,d7
  1531.   TST.l   c2pWindowsMem ; Check for existing mem allocated
  1532.   BEQ     Reservec2pWskip ; If exists, deallocate
  1533.   MOVE.w  c2pWindowsTotal,d0
  1534.   EXT.l   d0
  1535.   LSL.l   #c2pWindowStructSize,d0
  1536.   MOVE.l  c2pWindowsMem,a1
  1537.   ALibJsr #BlitzFreemem ; Free memory
  1538.   MOVE.l  d7,d0
  1539.   MOVE.w  #0,c2pWindowsTotal
  1540.   MOVE.l  #0,c2pWindowsMem
  1541. Reservec2pWskip
  1542.   AND.l   #$FFFF,d0
  1543.   MOVE.w  d0,d7
  1544.   LSL.l   #c2pWindowStructSize,d0
  1545.   MOVE.l  #ClearPublicMem,d1 ; MemType (public and clear)
  1546.   !CheckAvailMem{003}
  1547.   TST.b   d2 ; Likely?
  1548.   BEQ     Reservec2pWfailed
  1549.   ALibJsr #BlitzAllocmem ; Allocate memory
  1550.   TST.l   d0
  1551.   BEQ     Reservec2pWfailed
  1552.   MOVE.l  d0,c2pWindowsMem
  1553.   MOVE.w  d7,c2pWindowsTotal
  1554.   RTS     ; Return memory address in d0.l
  1555. Reservec2pWfailed
  1556.   MOVEQ.l #0,d0 ; Errorcode
  1557.   RTS
  1558.  
  1559. ;*************************************************************************************
  1560.  
  1561. _MFreec2pWindowsRange
  1562. ;Free a range of c2pWindow objects
  1563.   SUB.w   d0,d1 ; Total
  1564.   MOVE.w  d1,d3 ; Loopcounter, no need for -1
  1565.   MOVE.w  d0,d4 ; Start offset
  1566. Freec2pWRloop
  1567.   MOVE.w  d3,d0
  1568.   ADD.w   d4,d0
  1569.   BSR     _MFreec2pWindow
  1570.   DBRA    d3,Freec2pWRloop
  1571.   RTS
  1572. ._MFreec2pWindows
  1573. ;Free all c2pWindow objects
  1574.   MOVE.w  c2pWindowsTotal,d3
  1575.   SUBQ.w  #1,d3 ; loopcounter
  1576. Freec2pWloop
  1577.   MOVE.w  d3,d0
  1578.   BSR     _MFreec2pWindow ; Free it
  1579.   DBRA    d3,Freec2pWloop
  1580.   RTS
  1581.  
  1582. ;*************************************************************************************
  1583.  
  1584. ._MFreec2pWindow
  1585. ;Free a single c2pWindow object. No actual memory to free so just make inactive
  1586.   !Getc2pWindowObjectPtr ; Base into a0
  1587.   TST.l   c2p0_Pixels-c2pWindows(a0) ; Test Pixels and RowsStore
  1588.   BEQ     Freec2pWSkip
  1589.   MOVE.l  #0,c2p0_Pixels-c2pWindows(a0) ; Make it dead
  1590. Freec2pWSkip
  1591.   RTS
  1592.  
  1593. ;*************************************************************************************
  1594.  
  1595. ._MAddrc2pWindow
  1596. ;Returns the address of the specified c2pWindow structure
  1597.   !Getc2pWindowObjectPtr ; In a0
  1598.   MOVE.l  a0,d0 ; Return address
  1599.   RTS
  1600.  
  1601. ;*************************************************************************************
  1602.  
  1603. ._MUsec2pWindows
  1604. ;Set the currently used c2pWindows
  1605.   MOVE.w  d2,Currentc2pWindow3
  1606. _MUsec2pWindowsShort
  1607.   MOVE.w  d1,Currentc2pWindow2
  1608. _MUsec2pWindowsShortest
  1609.   MOVE.w  d0,Currentc2pWindow1
  1610.   RTS
  1611.  
  1612. ;*************************************************************************************
  1613.  
  1614. ._MUsec2pWindow
  1615. ;Set the currently used main c2pWindow
  1616.   MOVE.w  d0,Currentc2pWindow1
  1617.   RTS
  1618.  
  1619. ;*************************************************************************************
  1620.  
  1621. ._MUsedc2pWindow
  1622. ;Returns number of main currently used c2pWindow, or likely -1 if not defined
  1623.   MOVE.w  Currentc2pWindow1,d0
  1624.   RTS
  1625.  
  1626. ;*************************************************************************************
  1627.  
  1628. ._MAutoUsec2pWindows
  1629.   MOVE.b  d0,Autoc2pWindowsUse
  1630.   RTS
  1631.  
  1632. ;*************************************************************************************
  1633. ._MCopyc2pWindow
  1634. _MCopyc2pWindowStruct
  1635. ;Creat a new c2pWindow from an existing one, copying only definition data
  1636.   EXG.l   d0,d1
  1637.   !Getc2pWindowObjectPtr ; Base in a0
  1638.   EXG.l   d0,d1
  1639.   MOVE.l  a0,a1 ; Dest
  1640.   !Getc2pWindowObjectPtr ; Base in a0 - Source
  1641.   MOVE.w  c2p0_Pixels-c2pWindows(a0),c2p0_Pixels-c2pWindows(a1)
  1642.   MOVE.w  c2p0_RowsStore-c2pWindows(a0),c2p0_RowsStore-c2pWindows(a1)
  1643.   MOVE.w  c2p0LaceOffsetA-c2pWindows(a0),c2p0LaceOffsetA-c2pWindows(a1)
  1644.   MOVE.w  c2p0LaceOffsetB-c2pWindows(a0),c2p0LaceOffsetB-c2pWindows(a1)
  1645.   MOVE.w  c2p0_Cmod-c2pWindows(a0),c2p0_Cmod-c2pWindows(a1)
  1646.   MOVE.w  c2p0_Pmod-c2pWindows(a0),c2p0_Pmod-c2pWindows(a1)
  1647.   MOVE.b  c2p0Lace-c2pWindows(a0),c2p0Lace-c2pWindows(a1)
  1648.   TST.b   Autoc2pWindowsUse ; Use it?
  1649.   BEQ     MCopyc2pWStructDontUse ; No
  1650.   MOVE.w  d1,Currentc2pWindow1 ; Yes, store c2pWindow number in current
  1651. MCopyc2pWStructDontUse
  1652.   RTS
  1653.  
  1654. ;*************************************************************************************
  1655.  
  1656. ._MGenericPtr
  1657. ;Given a base address, xpos, ypos, and width, work out an address and return it
  1658.   MULU    d3,d1 ; Width*Ypos
  1659.   EXT.l   d0
  1660.   ADD.l   d0,d1 ; Add Xpos
  1661.   ADD.l   d2,d1 ; Add base address
  1662.   MOVE.l  d1,d0 ; Return longword in d0.l
  1663.   RTS
  1664.  
  1665. ;*************************************************************************************
  1666.  
  1667. .Data
  1668.   Even4
  1669. c2pLace:        Dc.b 0 ; Interlaced c2p (0=No, <>0=Yes)
  1670. c2pLaceFrame:   Dc.b 0 ; Interlace frame (line offset, 0 or 1 for even/odd)
  1671. c2p040useable:  Dc.b 1 ; Allow 040 c2p routines to be used ever (0=No, <>0=Yes)
  1672. c2pCPUmode:     Dc.b 1 ; 0=000-030, 1=040-060 c2p routine to use
  1673. c2pColumns:     Dc.b 0 ; Column lacing c2p (0=No, <>0=Yes)
  1674. c2pColumnsFrame:Dc.b 0 ; Column frame (longword offset, 0 or 1 for leftmost or second to left)
  1675. c2p_Rows:       Dc.w 0 ; Temporary
  1676. c2p_RowsStore:  Dc.w 0 ; Temporary
  1677. c2p_Pixels:     Dc.w 0 ; Temporary
  1678. c2p_Pmod:       Dc.w 0 ; Temporary
  1679. c2p_Cmod:       Dc.w 0 ; Temporary
  1680.  
  1681.   Even4
  1682. c2pWindowsMem:  Dc.l 0 ; Pointer to mem reserved for c2pWindow structures
  1683. c2pWindowsTotal:Dc.w 0 ; Total number of c2p windows (do -1 for highest)
  1684.  
  1685. Autoc2pWindowsUse: Dc.b 1 ; Automatically use new c2pWindows? 0=No, <>0=Yes
  1686.  
  1687.   Even4
  1688. Currentc2pWindows:
  1689. Currentc2pWindow1: Dc.w -1 ; Number of current c2pWindow
  1690. Currentc2pWindow2: Dc.w -1 ; Number of second current c2pWindow
  1691. Currentc2pWindow3: Dc.w -1 ; Number of third current c2pWindow
  1692.  
  1693. ;c2pWindow structure, 16 bytes
  1694. c2pWindows
  1695. c2p0_Pixels:    Dc.w 0 ;0 Number of pixels per row
  1696. c2p0_RowsStore: Dc.w 0 ;2 Row counter
  1697. c2p0LaceOffsetA:Dc.w 0 ;4 Interlace bytes to add to source pointer in odd frames
  1698. c2p0LaceOffsetB:Dc.w 0 ;6 Interlace bytes to add to dest pointer in odd frames
  1699. c2p0_Pmod:      Dc.w 0 ;8 Planar line modulo
  1700. c2p0_Cmod:      Dc.w 0 ;10 Chunky line modulo
  1701. c2p0Lace:       Dc.b 0 ;12 Same as Row-Lacing yes/no. Tells if rowlace was on when object was created
  1702. c2p0Pad0:       Dc.b 0 ;13
  1703. c2p0Pad1:       Dc.w 0 ;14
  1704.  
  1705. ;== 8< =================== 8< ============================= 8< ================= 8< ==
  1706.   Even4
  1707. RunErrors ; Runtime error routines. Everything below this point is discarded if
  1708.            ; compiled without runtime errorchecking switched on
  1709. .Checks
  1710.  
  1711. ;*************************************************************************************
  1712.  
  1713. _Mc2pLaceToggleDoubleCheck
  1714.   TST.b   d0
  1715.   BLT     Error15 ; Too small
  1716.   CMP.b   #1,d0
  1717.   BGT     Error15 ; Too large
  1718.   RTS
  1719.  
  1720. ;*************************************************************************************
  1721.  
  1722. _Mc2pLaceToggleTripleCheck
  1723.   TST.b   d0
  1724.   BLT     Error13 ; Too small
  1725.   CMP.b   #2,d0
  1726.   BGT     Error13 ; Too large
  1727.   RTS
  1728.  
  1729. ;*************************************************************************************
  1730.  
  1731. _Mc2pLaceToggleCheck
  1732.   TST.b   d0
  1733.   BLE     Error12 ; Too small
  1734.   CMP.b   #3,d0
  1735.   BGT     Error12 ; Too large
  1736.   TST.b   d1
  1737.   BLT     Error13 ; Too small
  1738.   CMP.b   #2,d1
  1739.   BGT     Error13 ; Too large
  1740.   MOVE.b  d1,d7
  1741.   ADDQ.l  #1,d7
  1742.   CMP.b   d0,d7
  1743.   BGT     Error14 ; Current buffer mustn't be of higher index than number of available buffers
  1744.   RTS
  1745.  
  1746. ;*************************************************************************************
  1747.  
  1748. _Mc2pCPUmodeCheck
  1749.   TST.b   d0
  1750.   BLT     Error7 ; Too small
  1751.   CMP.b   #4,d0
  1752.   BGT     Error7 ; Too large
  1753.   RTS
  1754.  
  1755. ;*************************************************************************************
  1756.  
  1757. _Mc2pWindowBriefShortCheck
  1758.   !CCheckc2pWindowsExist
  1759.   BRA     _Mc2pWindowCheckFirst3
  1760.   ;RTS not needed
  1761. _Mc2pWindowBriefCheck
  1762.   !CCheckc2pWindowsExist
  1763.   BSR     _Mc2pWindowCheckFirst3
  1764.   TST.b   d3
  1765.   BLT     Error7 ; Too small
  1766.   CMP.b   #4,d3
  1767.   BGT     Error7 ; Too large
  1768.   RTS
  1769. _Mc2pWindowShortCheck
  1770.   !CCheckc2pWindowsExist
  1771.   BSR     _Mc2pWindowCheckFirst3
  1772.   TST.w   d3
  1773.   BLE     Error8 ; Too small or larger than signed word
  1774.   TST.w   d4
  1775.   BLE     Error9 ; Too small or larger than signed word
  1776.   MOVE.w  d4,d7
  1777.   AND.w   #$1F,d7
  1778.   TST.w   d7
  1779.   BNE     Error10 ; Planar Width not multiple of 32
  1780.   TST.w   d5
  1781.   BLE     Error11 ; Too small or larger than signed word
  1782.   RTS
  1783. _Mc2pWindowCheck
  1784.   !CCheckc2pWindowsExist
  1785.   BSR     _Mc2pWindowCheckFirst3
  1786.   TST.w   d3
  1787.   BLE     Error8 ; Too small or larger than signed word
  1788.   TST.b   d4
  1789.   BLT     Error7 ; Too small
  1790.   CMP.b   #4,d4
  1791.   BGT     Error7 ; Too large
  1792.   TST.w   d5
  1793.   BLE     Error9 ; Too small or larger than signed word
  1794.   MOVE.w  d5,d7
  1795.   AND.w   #$1F,d7
  1796.   TST.w   d7
  1797.   BNE     Error10 ; Planar Width not multiple of 32
  1798.   TST.w   d6
  1799.   BLE     Error11 ; Too small or larger than signed word
  1800.   RTS
  1801. _Mc2pWindowCheckFirst3
  1802.   !CCheckc2pWindowNum
  1803.   TST.w   d1
  1804.   BLE     Error4 ; Too small or larger than signed word
  1805.   MOVE.w  d1,d7
  1806.   AND.w   #$1F,d7
  1807.   TST.w   d7
  1808.   BNE     Error5 ; OpWidth not multiple of 32
  1809.   TST.w   d2
  1810.   BLE     Error6 ; Too small or larger than signed word
  1811.   RTS
  1812.  
  1813. ;*************************************************************************************
  1814.  
  1815. _Mc2pWindowWidthCheck
  1816.   !CThreec2pWindowChecks
  1817.   RTS
  1818.  
  1819. ;*************************************************************************************
  1820.  
  1821. _Mc2pWindowHeightCheck
  1822.   !CThreec2pWindowChecks
  1823.   RTS
  1824.  
  1825. ;*************************************************************************************
  1826.  
  1827. _Mc2pWindowNewHeightCheck
  1828.   !CThreec2pWindowChecks
  1829.   TST.w   d1
  1830.   BLE     Error3 ; Too small or larger than signed word
  1831.   RTS
  1832.  
  1833. ;*************************************************************************************
  1834.  
  1835. _Mc2pCheck
  1836.   !CThreec2pWindowChecks
  1837.   TST.l   d1
  1838.   BEQ     Error1 ; Too small
  1839.   TST.l   d2
  1840.   BEQ     Error2 ; Too small
  1841.   RTS
  1842.  
  1843. ;*************************************************************************************
  1844.  
  1845. _MReservec2pWindowsCheck
  1846.   !CCheckWordParam2
  1847.   RTS
  1848.  
  1849. ;*************************************************************************************
  1850.  
  1851. _MFreec2pWindowsRangeCheck
  1852. ;Not really feasible to check existence of every c2pWindow in the range
  1853.   !CCheckc2pWindowsExist
  1854.   EXG.l   d0,d1
  1855.   !CCheckc2pWindowNum
  1856.   EXG.l   d0,d1
  1857.   !CCheckc2pWindowNum
  1858.   CMP.w   d0,d1
  1859.   BLT     Error36 ; First>Last
  1860.   RTS
  1861. _MFreec2pWindowsCheck
  1862.   !CCheckc2pWindowsExist
  1863.   RTS
  1864.  
  1865. ;*************************************************************************************
  1866.  
  1867. _MFreec2pWindowCheck
  1868.   !CThreec2pWindowChecks
  1869.   RTS
  1870.  
  1871. ;*************************************************************************************
  1872.  
  1873. _MAddrc2pWindowCheck
  1874.   !CThreec2pWindowChecks
  1875.   RTS
  1876.  
  1877. ;*************************************************************************************
  1878.  
  1879. _MUsec2pWindowsCheck
  1880.   EXG.l   d2,d0
  1881.   !CThreec2pWindowChecks
  1882.   EXG.l   d2,d0
  1883. _MUsec2pWindowsShortCheck
  1884.   EXG.l   d1,d0
  1885.   !CThreec2pWindowChecks
  1886.   EXG.l   d1,d0
  1887. _MUsec2pWindowsShortestCheck
  1888.   !CThreec2pWindowChecks
  1889.   RTS
  1890.  
  1891. ;*************************************************************************************
  1892.  
  1893. _MUsec2pWindowCheck
  1894.   !CThreec2pWindowChecks
  1895.   RTS
  1896.  
  1897. ;*************************************************************************************
  1898.  
  1899. _MUsedc2pWindowCheck
  1900.   !CCheckc2pWindowsExist
  1901.   TST.w   Currentc2pWindow1
  1902.   BLT     Error26 ; Not used
  1903.   RTS
  1904.  
  1905. ;*************************************************************************************
  1906.  
  1907. _MCopyc2pWindowStructCheck
  1908.   EXG.l   d0,d1
  1909.   !CCheckc2pWindowsExist
  1910.   !CCheckc2pWindowNum ; Dest doesn't have to exist
  1911.   EXG.l   d0,d1
  1912.   !CThreec2pWindowChecks ; Source MUST exist
  1913.   RTS
  1914.  
  1915. ;*************************************************************************************
  1916.  
  1917. _MGenericPtrCheck
  1918.   TST.w   d3 ; Width okay?
  1919.   BLE     Error64
  1920.   TST.l   d2 ; Address likely?
  1921.   BEQ     Error65
  1922.   ;Allow xpos,ypos to be negative
  1923.   RTS
  1924.  
  1925. ;*************************************************************************************
  1926.  
  1927. .Messages
  1928.  
  1929. Error0: MOVE.l #Error0Txt,d0 : TRAP #0
  1930. Error1: MOVE.l #Error1Txt,d0 : TRAP #0
  1931. Error2: MOVE.l #Error2Txt,d0 : TRAP #0
  1932. Error3: MOVE.l #Error3Txt,d0 : TRAP #0
  1933. Error4: MOVE.l #Error4Txt,d0 : TRAP #0
  1934. Error5: MOVE.l #Error5Txt,d0 : TRAP #0
  1935. Error6: MOVE.l #Error6Txt,d0 : TRAP #0
  1936. Error7: MOVE.l #Error7Txt,d0 : TRAP #0
  1937. Error8: MOVE.l #Error8Txt,d0 : TRAP #0
  1938. Error9: MOVE.l #Error9Txt,d0 : TRAP #0
  1939. Error10: MOVE.l #Error10Txt,d0 : TRAP #0
  1940. Error11: MOVE.l #Error11Txt,d0 : TRAP #0
  1941. Error12: MOVE.l #Error12Txt,d0 : TRAP #0
  1942. Error13: MOVE.l #Error13Txt,d0 : TRAP #0
  1943. Error14: MOVE.l #Error14Txt,d0 : TRAP #0
  1944. Error15: MOVE.l #Error15Txt,d0 : TRAP #0
  1945. Error16: MOVE.l #Error16Txt,d0 : TRAP #0
  1946. Error17: MOVE.l #Error17Txt,d0 : TRAP #0
  1947. Error18: MOVE.l #Error18Txt,d0 : TRAP #0
  1948. Error25: MOVE.l #Error25Txt,d0 : TRAP #0
  1949. Error26: MOVE.l #Error26Txt,d0 : TRAP #0
  1950. Error36: MOVE.l #Error36Txt,d0 : TRAP #0
  1951. Error60: MOVE.l #Error60Txt,d0 : TRAP #0
  1952. Error64: MOVE.l #Error64Txt,d0 : TRAP #0
  1953. Error65: MOVE.l #Error65Txt,d0 : TRAP #0
  1954. Error0Txt: Dc.b "c2pWindow number out of range",0
  1955. Error1Txt: Dc.b "Chunky address of zero is not allowed",0
  1956. Error2Txt: Dc.b "Planar address of zero is not allowed",0
  1957. Error3Txt: Dc.b "Requested new height is out of range",0
  1958. Error4Txt: Dc.b "Operation/Window width is out of range",0
  1959. Error5Txt: Dc.b "Operation/Window width should be a multiple of 32!",0
  1960. Error6Txt: Dc.b "Operation/Window height is out of range",0
  1961. Error7Txt: Dc.b "Processor should be in the range 0..4 (4=040,<4=030)",0
  1962. Error8Txt: Dc.b "Source Byte-Width (bytes per rasterline) is out of range",0
  1963. Error9Txt: Dc.b "Width of planar display is out of range",0
  1964. Error10Txt: Dc.b "Width of planar display must be a multiple of 32 pixels",0
  1965. Error11Txt: Dc.b "Height of planar display is out of range",0
  1966. Error12Txt: Dc.b "Buffering should be 1 (single), 2 (double) or 3 (triple)",0
  1967. Error13Txt: Dc.b "Current buffer should be 0, 1 or 2",0
  1968. Error14Txt: Dc.b "Specified current-buffer number too high",0
  1969. Error15Txt: Dc.b "Current buffer should be 0 or 1",0
  1970. Error16Txt: Dc.b "c2pWindows not available. Use MReservec2pWindows",0
  1971. Error17Txt: Dc.b "The specified c2pWindow object is undefined",0
  1972. Error18Txt: Dc.b "Number of objects shouldn't be more than signed-word limit",0
  1973. Error25Txt: Dc.b "Number of objects should be greater than 0",0
  1974. Error26Txt: Dc.b "No currently used c2pWindow object",0
  1975. Error36Txt: Dc.b "First c2pWindow shouldn't be greater than Second c2pWindow",0
  1976. Error60Txt: Dc.b "Number of items out of range",0
  1977. Error64Txt: Dc.b "Width should be greater than 0",0
  1978. Error65Txt: Dc.b "Address of 0 is not allowed",0
  1979.   Even4
  1980.  
  1981.